package com.yinsin.utils;

import java.net.InetAddress;
import java.net.UnknownHostException;

import com.yinsin.other.LogHelper;

/**
 * 获取系统、运行环境的一些信息
 * 
 * @author Yisin
 *
 */
public class SystemUtils {
    private static final LogHelper logger = LogHelper.getLogger(SystemUtils.class);

    /***** Java运行时环境信息 *****/
    /** Java 运行时环境规范名称 */
    private final static String SPECIFICATION_NAME = get("java.specification.name");
    /** Java 运行时环境版本 */
    private final static String VERSION = get("java.version");
    /** Java 运行时环境规范版本 */
    private final static String SPECIFICATION_VERSION = get("java.specification.version");
    /** Java 安装目录 */
    private final static String HOME = get("java.home");
    /** 加载库时搜索的路径列表 */
    private final static String LIBRARY_PATH = get("java.library.path");
    /** 默认的临时文件路径 */
    private final static String TMPDIR = get("java.io.tmpdir");
    /** 要使用的 JIT 编译器的名称 */
    private final static String COMPILER = get("java.compiler");
    /** 一个或多个扩展目录的路径 */
    private final static String EXT_DIRS = get("java.ext.dirs");

    /***** Java虚拟机信息 *****/
    /** Java 虚拟机实现名称 */
    private final static String JAVA_VM_NAME = get("java.vm.name");
    /** Java 虚拟机规范名称 */
    private final static String JAVA_VM_SPECIFICATION_NAME = get("java.vm.specification.name");
    /** Java 虚拟机实现版本 */
    private final static String JAVA_VM_VERSION = get("java.vm.version");
    /** Java 虚拟机规范版本 */
    private final static String JAVA_VM_SPECIFICATION_VERSION = get("java.vm.specification.version");
    /** java虚拟机信息 */
    private static final String JAVA_VM_INFO = get("java.vm.info", false);

    /***** Java类信息 *****/
    /** Java 类格式版本号 */
    private final static String CLASS_VERSION = get("java.class.version");
    /** Java 类路径 */
    private final static String CLASS_PATH = get("java.class.path");

    /***** OS信息 *****/
    /** 操作系统的名称 */
    private final static String OS_NAME = get("os.name");

    /** 操作系统的架构 */
    private final static String OS_ARCH = get("os.arch");

    /** 操作系统的版本 */
    private final static String OS_VERSION = get("os.version");

    /** 文件分隔符（在 UNIX 系统中是“/”） */
    private final static String FILE_SEPRATOR = get("file.separator");

    /** 路径分隔符（在 UNIX 系统中是“:”） */
    private final static String PATH_SEPRATOR = get("path.separator");

    /** 行分隔符（在 UNIX 系统中是“\n”） */
    private final static String LINE_SEPRATOR = get("line.separator");

    /***** 用户信息 *****/
    /** 用户的账户名称 */
    private final static String USER_NAME = get("user.name");
    /** 用户的主目录 */
    private final static String USER_HOME = get("user.home");
    /** 用户的当前工作目录 */
    private final static String USER_DIR = get("user.dir");
    
    /** 主机信息 **/
    private static String HOST_NAME = null;
    
    private static String HOST_ADDRESS = null;
    
    public static String getHostName(){
        if(HOST_NAME == null){
            String hostName;
            try {
                InetAddress localhost = InetAddress.getLocalHost();
                hostName = localhost.getHostName();
            } catch (UnknownHostException e) {
                hostName = "localhost";
            }
            HOST_NAME = hostName;
        }
        return HOST_NAME;
    }
    
    public static String getHostAddress(){
        if(HOST_ADDRESS == null){
            String hostAddress;
            try {
                InetAddress localhost = InetAddress.getLocalHost();
                hostAddress = localhost.getHostAddress();
            } catch (UnknownHostException e) {
                hostAddress = "127.0.0.1";
            }
            HOST_ADDRESS = hostAddress;
        }
        return HOST_ADDRESS;
    }

    /**
     * 取得系统属性，如果因为Java安全的限制而失败，则返回 null
     * 
     * @param name
     *            属性名
     * @param quiet
     *            安静模式，不将出错信息打在System.err中
     * @return 属性值或null
     */
    public static String get(String name, boolean quiet) {
        try {
            return System.getProperty(name);
        } catch (SecurityException e) {
            if (!quiet) {
                logger.error("Caught a SecurityException reading the system property '" + name + "'; the SystemUtil property value will default to null.");
            }
            return null;
        }
    }

    /**
     * 取得系统属性，如果因为Java安全的限制而失败，则返回 null
     * 
     * @param name
     *            属性名
     * @return 属性值或null
     */
    public static String get(String name) {
        return get(name, true);
    }

    /**
     * 判断是否为windows操作系统
     * 
     * @return
     */
    public static boolean isWindow() {
        return OS_NAME.toLowerCase().startsWith("win");
    }

    /**
     * 判断是否为Linux操作系统
     * 
     * @return
     */
    public static boolean isLinux() {
        return OS_NAME.toLowerCase().startsWith("linux");
    }

    /** Java 运行时环境规范名称 */
    public final static String getSpecificationName() {
        return SPECIFICATION_NAME;
    };

    /** Java 运行时环境版本 */
    public final static String getVersion() {
        return VERSION;
    }

    /** Java 运行时环境规范版本 */
    public final static String getSpecificationVersion() {
        return SPECIFICATION_VERSION;
    }

    /** Java 安装目录 */
    public final static String getJavaHome() {
        return HOME;
    }

    /** 加载库时搜索的路径列表 */
    public final static String getLibraryPath() {
        return LIBRARY_PATH;
    };

    /** 默认的临时文件路径 */
    public final static String getTmpdir() {
        return TMPDIR;
    }

    /** 要使用的 JIT 编译器的名称 */
    public final static String getCompiler() {
        return COMPILER;
    }

    /** 一个或多个扩展目录的路径 */
    public final static String getExtDirs() {
        return EXT_DIRS;
    }

    /***** Java虚拟机信息 *****/
    /** Java 虚拟机实现名称 */
    public final static String getJavaVmName() {
        return JAVA_VM_NAME;
    }

    /** Java 虚拟机规范名称 */
    public final static String getJavaVmSpecificationName() {
        return JAVA_VM_SPECIFICATION_NAME;
    }

    /** Java 虚拟机实现版本 */
    public final static String getJavaVmVersion() {
        return JAVA_VM_VERSION;
    }

    /** Java 虚拟机规范版本 */
    public final static String getJavaVmSpecificationVersion() {
        return JAVA_VM_SPECIFICATION_VERSION;
    }

    /***** Java类信息 *****/
    /** Java 类格式版本号 */
    public final static String getClassVersion() {
        return CLASS_VERSION;
    }

    /** Java 类路径 */
    public final static String getClassPath() {
        return CLASS_PATH;
    }

    /***** OS信息 *****/
    /** 操作系统的名称 */
    public final static String getOsName() {
        return OS_NAME;
    }

    /** 操作系统的架构 */
    public final static String getOsArch() {
        return OS_ARCH;
    }

    /** 操作系统的版本 */
    public final static String getOsVersion() {
        return OS_VERSION;
    }

    /** 文件分隔符（在 UNIX 系统中是“/”） */
    public final static String getFileSeprator() {
        return FILE_SEPRATOR;
    }

    /** 路径分隔符（在 UNIX 系统中是“:”） */
    public final static String getPathSeprator() {
        return PATH_SEPRATOR;
    }

    /** 行分隔符（在 UNIX 系统中是“\n”） */
    public final static String getLineSeprator() {
        return LINE_SEPRATOR;
    }

    /***** 用户信息 *****/
    /** 用户的账户名称 */
    public final static String getUserName() {
        return USER_NAME;
    }

    /** 用户的主目录 */
    public final static String getUserHome() {
        return USER_HOME;
    }

    /** 用户的当前工作目录 */
    public final static String getUserDir() {
        return USER_DIR;
    }

    /**
     * 获取java虚拟机信息
     * @return
     */
    public static final String getJavaVmInfo() {
        return JAVA_VM_INFO;
    }

    public static final String getSystemInfo() {
        StringBuilder sb = new StringBuilder();
        sb.append("java.specification.name").append("=").append(getSpecificationName()).append(Constants.ENTER);
        sb.append("java.version").append("=").append(getVersion()).append(Constants.ENTER);
        sb.append("java.specification.version").append("=").append(getSpecificationVersion()).append(Constants.ENTER);
        sb.append("java.home").append("=").append(getJavaHome()).append(Constants.ENTER);
        sb.append("java.library.path").append("=").append(getLibraryPath()).append(Constants.ENTER);
        sb.append("java.io.tmpdir").append("=").append(getTmpdir()).append(Constants.ENTER);
        sb.append("java.compiler").append("=").append(getCompiler()).append(Constants.ENTER);
        sb.append("java.ext.dirs").append("=").append(getExtDirs()).append(Constants.ENTER);
        sb.append("java.vm.name").append("=").append(getJavaVmName()).append(Constants.ENTER);
        sb.append("java.vm.specification.name").append("=").append(getJavaVmSpecificationName()).append(Constants.ENTER);
        sb.append("java.vm.version").append("=").append(getVersion()).append(Constants.ENTER);
        sb.append("java.vm.info").append("=").append(getJavaVmInfo()).append(Constants.ENTER);
        sb.append("java.vm.specification.version").append("=").append(getJavaVmSpecificationVersion()).append(Constants.ENTER);
        sb.append("java.class.version").append("=").append(getClassVersion()).append(Constants.ENTER);
        sb.append("java.class.path").append("=").append(getClassPath()).append(Constants.ENTER);
        sb.append("os.name").append("=").append(getOsName()).append(Constants.ENTER);
        sb.append("os.arch").append("=").append(getOsArch()).append(Constants.ENTER);
        sb.append("os.version").append("=").append(getOsVersion()).append(Constants.ENTER);
        sb.append("file.separator").append("=").append(getFileSeprator()).append(Constants.ENTER);
        sb.append("path.separator").append("=").append(getPathSeprator()).append(Constants.ENTER);
        sb.append("user.name").append("=").append(getUserName()).append(Constants.ENTER);
        sb.append("user.home").append("=").append(getUserHome()).append(Constants.ENTER);
        sb.append("user.dir").append("=").append(getUserDir());
        return sb.toString();
    }

    public static void main(String[] args) {
        logger.info(getHostName());
        logger.info(getSystemInfo());
    }

}
